// 抽象动物类
class Animal {
    constructor(name, species, breed, price) {
        this.name = name;
        this.species = species;
        this.breed = breed;
        this.price = price;
    }

    eat() {
        console.log(`${this.name} 正在吃饭。`);
    }

    sleep() {
        console.log(`${this.name} 正在睡觉。`);
    }

    play() {
        console.log(`${this.name} 正在玩。`);
    }

    makeSound() {
        console.log(`${this.name} 发出了声音。`);
    }
}

// 小猫类
class Cat extends Animal {
    constructor(name, breed, price) {
        super(name, '猫', breed, price);
        this.isPlaying = false; // 是否正在玩的标志
    }

    play() {
        super.play();
        this.isPlaying = true;
    }

    stopPlaying() {
        this.isPlaying = false;
        console.log(`${this.name} 不再玩了。`);
    }

    makeSound() {
        if (this.isPlaying) {
            console.log(`${this.name} 在玩耍时发出喵喵声。`);
        } else {
            console.log(`${this.name} 只有在玩的时候才会叫。`);
        }
    }
}

// 小狗类
class Dog extends Animal {
    constructor(name, breed, price) {
        super(name, '狗', breed, price);
    }

    makeSound() {
        console.log(`${this.name} 发出了汪汪声。`);
    }
}

// 实例化小猫对象
const cat1 = new Cat('小花', '英短', 1000);
const cat2 = new Cat('小黑', '加菲', 1500);

// 实例化小狗对象
const dog1 = new Dog('小白', '金毛', 2000);
const dog2 = new Dog('小黄', '哈士奇', 2500);

// 测试小猫对象的方法
cat1.eat();       // 小花 正在吃饭。
cat1.sleep();     // 小花 正在睡觉。
cat1.makeSound(); // 小花 只有在玩的时候才会叫。
cat1.play();      // 小花 正在玩。
cat1.makeSound(); // 小花 在玩耍时发出喵喵声。
cat1.stopPlaying();// 小花 不再玩了。
cat1.makeSound(); // 小花 只有在玩的时候才会叫。

// 测试小狗对象的方法
dog1.eat();       // 小白 正在吃饭。
dog1.sleep();     // 小白 正在睡觉。
dog1.play();      // 小白 正在玩。
dog1.makeSound(); // 小白 发出了汪汪声。
dog2.eat();       // 小黄 正在吃饭。
dog2.sleep();     // 小黄 正在睡觉。
dog2.play();      // 小黄 正在玩。
dog2.makeSound(); // 小黄 发出了汪汪声。